const express = require('express')
const router = express.Router()
const passport = require('passport')
const Product = require('../models/Products')
/*
处理文件上传的路由
 */
const multer = require('multer')
const path = require('path')
const fs = require('fs')

//添加商品
router.post('/product/add', passport.authenticate('jwt', { session: false }), (req, res) => {
  const productData = req.body
  const newProduct = new Product({
    name: productData.name,
    desc: productData.desc,
    price: productData.price,
    detail: productData.detail,
    categoryId: productData.categoryId,
    pCategoryId: productData.pCategoryId,
    imgs: productData.imgs,
  })
  newProduct.save().then(product => {
    res.json({
      status: 200,
      data: product,
      msg: '添加商品成功'
    })
  }).catch(error => {
    console.error('添加产品异常', error)
    res.json({ status: 400, msg: '添加商品异常, 请重新尝试' })
  })
})

//获取商品分页列表
router.get('/product/list', passport.authenticate('jwt', { session: false }), (req, res) => {
  const { pageNum, pageSize } = req.query
  Product.find({}).then(products => {
    res.json({
      status: 200,
      data: pageFilter(products, pageNum, pageSize),
      msg: '获取商品列表成功'
    })
  }).catch(error => {
    console.error('获取商品列表异常', error)
    res.json({ status: 400, msg: '获取商品列表异常, 请重新尝试' })
  })
})

//搜索产品列表
router.get('/product/search', passport.authenticate('jwt', { session: false }), (req, res) => {
  const {
    pageNum,
    pageSize,
    productName,
    productDesc
  } = req.query
  let contition = {}
  if (productName) {
    contition = { name: new RegExp(productName) }
  } else if (productDesc) {
    /* 
      点（.）表示匹配出换行符以外的任意一个字符串
      星号（*）表示匹配前面一个字符串0次或多次
      这两个字符串一起使用表示匹配除换行符以外的任意多个字符；
      也就是说（.*）组合时，会尽可能多的去匹配满足条件的字符换；
      这就是点星（.*）的贪婪性
    */
    contition = { desc: new RegExp(`^.*${productDesc}.*$`) }
  }
  Product.find(contition)
    .then(products => {
      res.json({
        status: 0,
        data: pageFilter(products, pageNum, pageSize),
        msg: '查找成功'
      })
    })
    .catch(error => {
      console.error('搜索商品列表异常', error)
      res.json({ status: 400, msg: '搜索商品列表异常, 请重新尝试' })
    })
})

//更新商品
router.put('/product/update', passport.authenticate('jwt', { session: false }), (req, res) => {
  const product = req.body
  Product.findByIdAndUpdate(
    { _id: product.id },
    { $set: product },
    { new: true }
  ).then(newProduct => {
    res.json({
      status: 200,
      data: newProduct,
      msg: '更新商品成功'
    })
  }).catch(error => {
    console.error('更新商品异常', error)
    res.json({ status: 400, msg: '更新商品名称异常, 请重新尝试' })
  })
})

// 更新产品状态(上架/下架)
router.put('/product/updateStatus', passport.authenticate('jwt', { session: false }), (req, res) => {
  const product = req.body
  Product.findOneAndUpdate(
    { _id: product.productId },
    { $set: product },
    { new: true }
  ).then(newProduct => {
    res.json({
      status: 200,
      data: newProduct,
      msg: '更新状态成功'
    })
  }).catch(error => {
    console.error('更新产品状态异常', error)
    res.json({ status: 400, msg: '更新产品状态异常, 请重新尝试' })
  })

})

//上传图片的接口及相关操作
//__dirname表示当前文件所在的根路径，也就是/routers，然后..表示向上退一级，也就是到了项目根目录，然后public/upload表示到了这个目录
const dirPath = path.join(__dirname, '..', 'public/upload')
const storage = multer.diskStorage({
  // 定义保存到那个目录, //string时,服务启动将会自动创建文件夹
  destination: function (req, file, cb) { //函数需手动创建文件夹
    // console.log('destination()', file)
    if (!fs.existsSync(dirPath)) { //如果这个目录不存在，就创建一个这样的目录
      fs.mkdir(dirPath, function (err) {
        if (err) {
          console.log(err)
        } else {
          cb(null, dirPath)
        }
      })
    } else {
      cb(null, dirPath)
    }
  },
  filename: function (req, file, cb) {
    // console.log('filename()', file)
    var ext = path.extname(file.originalname)
    cb(null, file.fieldname + '-' + Date.now() + ext)
  }
})
const upload = multer({ storage })
const uploadSingle = upload.single('image')

// 上传图片
router.post('/img/upload', passport.authenticate('jwt', { session: false }), (req, res) => {
  uploadSingle(req, res, function (err) { //错误处理
    if (err) {
      return res.json({
        status: 400,
        msg: '上传文件失败'
      })
    }
    const file = req.file
    console.log(file)
    res.json({
      status: 200,
      data: {
        name: file.filename,
        url: 'http://localhost:5002/upload/' + file.filename
      },
      msg: '上传图片成功'
    })
  })
})

// 删除图片
router.delete('/img/delete', passport.authenticate('jwt', { session: false }), (req, res) => {
  const { id, name } = req.body
  console.log(req.body)
  fs.unlink(path.join(dirPath, name), (err) => {
    if (err) {
      console.log(err)
      res.json({
        status: 400,
        msg: '删除图片失败'
      })
    } else {
      res.json({
        status: 200,
        msg: '删除图片成功'
      })

    }
  })

  Product.findById({ _id: id })
    .then(doc => {
      console.log(doc)
      for (let i = 0; i < doc.imgs.length; i++) {
        if (doc.imgs[i].indexOf(name) !== -1) {
          delete doc.imgs[i]
        }
      }
      doc.save()
    }).catch(err => {
      res.json({
        status: 400,
        msg: '删除商品出错了，请稍后再试'
      })
    })
})

//删除商品
router.delete('/product/delete', passport.authenticate('jwt', { session: false }), (req, res) => {
  const productId = req.query.productId
  console.log(productId)
  Product.findByIdAndDelete({ _id: productId })
    .then(doc => {
      res.json({
        status: 200,
        msg: '删除商品成功'
      })
    }).catch(err => {
      res.json({
        status: 400,
        msg: '删除商品出错了，请稍后再试'
      })
    })
})

/*
得到指定数组的分页信息对象
 */
function pageFilter (arr, pageNum, pageSize) {
  pageNum = pageNum * 1
  pageSize = pageSize * 1
  const total = arr.length
  const pages = Math.floor((total + pageSize - 1) / pageSize)
  const start = pageSize * (pageNum - 1)
  const end = start + pageSize <= total ? start + pageSize : total
  const list = []
  for (var i = start; i < end; i++) {
    list.push(arr[i])
  }

  return {
    pageNum,
    total,
    pages,
    pageSize,
    list
  }
}

module.exports = router